package com.yanfan.iot.service;

import com.yanfan.common.core.device.DeviceAndProtocol;
import com.yanfan.common.core.domain.AjaxResult;
import com.yanfan.common.core.thingsModel.ThingsModelSimpleItem;
import com.yanfan.common.core.thingsModel.ThingsModelValuesInput;
import com.yanfan.common.enums.DeviceStatus;
import com.yanfan.iot.domain.*;
import com.yanfan.iot.model.*;
import com.yanfan.iot.model.ThingsModels.ThingsModelShadow;
import com.yanfan.iot.model.ThingsModels.ThingsModelValueItem;
import com.yanfan.iot.model.dto.ThingsModelDTO;
import org.quartz.SchedulerException;

import java.util.List;

/**
 * 设备Service接口
 *
 * @author kerwincui
 * @date 2021-12-16
 */
public interface IDeviceService {
    /**
     * 查询设备
     *
     * @param deviceId 设备主键
     * @return 设备
     */
    Device selectDeviceByDeviceId(Long deviceId);

    /**
     * 查询设备统计信息
     *
     * @return 设备
     */
    DeviceStatistic selectDeviceStatistic();

    DeviceStatistic selectDeviceStatisticByUserID();

    /**
     * 根据设备编号查询设备
     *
     * @param serialNumber 设备主键
     * @return 设备
     */
    Device selectDeviceBySerialNumber(String serialNumber);

    /**
     * 根据设备编号查询简洁设备
     *
     * @param serialNumber 设备主键
     * @return 设备
     */
    Device selectShortDeviceBySerialNumber(String serialNumber);

    /**
     * 根据设备编号查询设备认证信息
     *
     * @param model 设备编号和产品ID
     * @return 设备
     */
    ProductAuthenticateModel selectProductAuthenticate(AuthenticateInputModel model);

    /**
     * 查询设备和运行状态
     *
     * @param deviceId 设备主键
     * @return 设备
     */
    DeviceShortOutput selectDeviceRunningStatusByDeviceId(Long deviceId);

    /**
     * 上报设备的物模型
     *
     * @param input
     * @return
     */
    List<ThingsModelSimpleItem> reportDeviceThingsModelValue(ThingsModelValuesInput input, int type, boolean isShadow);

    /**
     * 查询设备列表
     *
     * @param device 设备
     * @return 设备集合
     */
    List<Device> selectDeviceList(Device device);

    /**
     * 查询未分配授权码设备列表
     *
     * @param device 设备
     * @return 设备集合
     */
    List<Device> selectUnAuthDeviceList(Device device);

    /**
     * 查询分组可添加设备分页列表
     *
     * @param device 设备
     * @return 设备集合
     */
    List<Device> selectDeviceListByGroup(Device device);

    /**
     * 查询所有设备简短列表
     *
     * @return 设备
     */
    List<DeviceAllShortOutput> selectAllDeviceShortList(Device device);

    /**
     * 查询设备简短列表
     *
     * @param device 设备
     * @return 设备集合
     */
    List<DeviceShortOutput> selectDeviceShortList(Device device);

    /**
     * 新增设备
     *
     * @param device 设备
     * @return 结果
     */
    Device insertDevice(Device device);

    /**
     * 设备关联用户
     *
     * @param deviceRelateUserInput 设备
     * @return 结果
     */
    AjaxResult deviceRelateUser(DeviceRelateUserInput deviceRelateUserInput);

    /**
     * 设备认证后自动添加设备
     *
     * @return 结果
     */
    int insertDeviceAuto(String serialNumber, Long userId, Long productId);

    /**
     * 获取设备设置的影子
     *
     * @param device
     * @return
     */
    ThingsModelShadow getDeviceShadowThingsModel(Device device);

    /**
     * 修改设备
     *
     * @param device 设备
     * @return 结果
     */
    AjaxResult updateDevice(Device device);

    /**
     * 更新设备状态和定位
     *
     * @param device 设备
     * @return 结果
     */
    int updateDeviceStatusAndLocation(Device device, String ipAddress);

    /**
     * 更新设备状态
     *
     * @param device 设备
     * @return 结果
     */
    int updateDeviceStatus(Device device);

    /**
     * 更新固件版本
     *
     * @param device
     * @return
     */
    int updateDeviceFirmwareVersion(Device device);

    /**
     * 上报设备信息
     *
     * @param device 设备
     * @return 结果
     */
    int reportDevice(Device device, Device deviceentity);

    /**
     * 删除设备
     *
     * @param deviceId 需要删除的设备主键集合
     * @return 结果
     */
    AjaxResult deleteDeviceByDeviceId(Long deviceId) throws SchedulerException;

    /**
     * 根据网关编号删除子设备
     *
     * @param gwCode
     */
    void deleteSubDevice(String gwCode);

    /**
     * 缓存设备状态到redis
     *
     * @return
     */
    List<ThingsModelValueItem> cacheDeviceStatus(Long productId, String serialNumber);

    /**
     * 生成设备唯一编号
     *
     * @return 结果
     */
    String generationDeviceNum(Integer type);

    /**
     * 重置设备状态
     *
     * @return 结果
     */
    int resetDeviceStatus(String deviceNum);

    /**
     * 根据设备编号查询协议编码
     *
     * @param serialNumber 设备编号
     * @return
     */
    DeviceAndProtocol selectProtocolBySerialNumber(String serialNumber);

    /**
     * 查询产品下所有设备，返回设备编号
     *
     * @param productId 产品id
     * @return
     */
    List<Device> selectDevicesByProductId(Long productId, Integer hasSub);

    /**
     * 查询子设备总数
     *
     * @param gwDevCode 网关编号
     * @return 数量
     */
    Integer getSubDeviceCount(String gwDevCode);

    /**
     * 批量更新设备状态
     *
     * @param serialNumbers 设备ids
     * @param status        状态
     */
    void batchChangeStatus(List<String> serialNumbers, DeviceStatus status);

    /**
     * 查询在线的modbus网关设备
     *
     * @return
     */
    List<Device> selectOnlineModbusDevices();

    /**
     * 根据设备编号查询设备信息 -不带缓存物模型值
     *
     * @param serialNumber
     * @return
     */
    Device selectDeviceNoModel(String serialNumber);

    /**
     * 获取设备MQTT连接参数
     *
     * @param deviceId 设备id
     * @return
     */
    DeviceMqttConnectVO getMqttConnectData(Long deviceId);

    /**
     * 根据产品ID获取产品下所有编号
     *
     * @param productId
     * @return
     */
    String[] getDeviceNumsByProductId(Long productId);

    /**
     * 根据产品ID查询设备状态
     *
     * @param productId
     * @return
     */
    List<DeviceNumberStatus> selectDeviceStatusByProductId(Long productId);

    /**
     * 重置设备状态
     */
    void reSetDeviceStatus();

    /**
     * 查询用户拥有设备
     *
     * @param userId 用户id
     * @return 设备列表
     */
    List<Device> selectDeviceListByUser(Long userId);


    /**
     * 获取设备运行状态
     *
     * @param serialNumber 设备编号
     * @return java.lang.String
     */
    Integer getStatusBySerialNumber(String serialNumber);

    /**
     * 获取所有已经激活并不是禁用的设备
     *
     * @return
     */
    List<DeviceStatusVO> selectDeviceActive();

    /**
     * 批量导入设备
     *
     * @param deviceImportVOList 模板数据
     * @return java.lang.String
     * @param: productId 产品id
     */
    String importDevice(List<DeviceImportVO> deviceImportVOList, Long productId);

    /**
     * 批量导入分配设备
     *
     * @param deviceAssignmentVOS 设备集合
     * @return java.lang.String
     * @param: productId
     * @param: deptId
     */
    String importAssignmentDevice(List<DeviceAssignmentVO> deviceAssignmentVOS, Long productId, Long deptId);

    /**
     * 分配设备
     *
     * @param deptId 机构id
     * @return com.yanfan.common.core.domain.AjaxResult
     * @param: deviceIds 设备id字符串
     */
    AjaxResult assignment(Long deptId, String deviceIds);

    /**
     * 回收设备
     *
     * @return com.yanfan.common.core.domain.AjaxResult
     * @param: deviceIds 设备id字符串
     */
    AjaxResult recovery(String deviceIds, Long recoveryDeptId);

    /**
     * 查询终端用户设备简短列表，主页列表数据
     */
    List<DeviceShortOutput> listTerminalUser(Device device);

    List<Device> listTerminalUserByGroup(Device device);

    /**
     * 根据监控设备channelId获取设备
     *
     * @param channelId
     * @return
     */
    Device selectDeviceByChannelId(String channelId);

    /**
     * 查询设备状态以及传输协议
     *
     * @param serialNumber
     * @return
     */
    DeviceStatusVO selectDeviceStatusAndTransportStatus(String serialNumber);

    /**
     * 获取设备物模型概况
     *
     * @param deviceId 设备id
     * @return java.util.List<com.yanfan.iot.model.ThingsModelItem.ThingsModelShortVO>
     */
    List<ThingsModelDTO> listThingsModel(Long deviceId);

    void updateByOrder(Long userId, Long deviceId);

    /**
     * 根据分组id集合查询设备分组
     *
     * @param groupIds 设备分组主键
     * @return 设备分组
     */
    List<DeviceGroup> listDeviceGroupByGroupIds(List<Long> groupIds);

    /**
     * 查询设备统计信息
     *
     * @return 设备
     */
    DeviceStatistic selectDashBoardDeviceStatistic();


    /**
     * 查询设备历史轨迹信息
     *
     * @param serialNumber 设备编号
     * @param beginDate    开始时间
     * @param endDate      结束时间
     * @return
     */
    List<DeviceVo> listDeviceHis(String serialNumber, String beginDate, String endDate);

    /**
     * dtu测试
     **/
    int updateDtudev(Dtucs dtucs);

    String getJosn(String mobile_imei);

    List<DtuDevice> getDtuDeviceList(String deviceDtuName);

    List<DtuDeviceGroup> getDtuDeviceGroup();

    AjaxResult addDtuDevice(DtuDevice device);

    AjaxResult updateDtuDevice(DtuDevice device);

    int deleteDtuDevice(List<DtuDevice> deviceList);

    List<DtuDeviceGroupVo> getDtuDeviceGroupVoList(Dtucs dtucs);

    AjaxResult addAndUpdateDtuDevGroup(DtuDeviceGroup dtuDeviceGroup);

    int deleteDtuDeviceGroup(Long deviceDtuGroupid);

    /**
     * 添加异常数据
     */
    int addDeviceAbnormal(DeviceAbnormal deviceAbnormal);

    List<DeviceAbnormal> getDeviceAbnormalList(DeviceAbnormal deviceAbnormal);

    List<DeviceAisfpt> selectDeviceAisfptList(DeviceAisfpt deviceAisfpt);

    int addAndUpdateDeviceAisfpt(DeviceAisfpt deviceAisfpt);

    int deleteDeviceAisfpt(Long aiSfptId);

    AjaxResult updateMqttConnectData(DeviceMqttConnectVO deviceMqttConnectVO);

    DeviceMqttConnectVO getDeviceMqttConnect(String clientId,String serialNumber);

    List<Device> queryDeviceList();
}
